ট্রানজেকশন কী?
ট্রানজেকশন (Transaction) হলো একটি সিরিজ ডেটাবেস অপারেশন যা একটি ইউনিট হিসাবে কাজ করে। একাধিক ডেটাবেস অপারেশন একত্রে সম্পন্ন হতে হবে অথবা একেবারে বাতিল হতে হবে। এটি ACID (Atomicity, Consistency, Isolation, Durability) প্রিন্সিপল অনুসরণ করে।
উদাহরণস্বরূপ: একটি ব্যাংকের অ্যাকাউন্ট ট্রান্সফার সিস্টেমে, যদি এক অ্যাকাউন্ট থেকে টাকা ডেবিট করা হয় এবং অন্য অ্যাকাউন্টে জমা দেওয়া হয়, তবে উভয় অপারেশন সফল হতে হবে। কোনো একটি ব্যর্থ হলে পুরো ট্রানজেকশন বাতিল হবে।
Spring Boot-এ Transaction Management
Spring Boot-এ ট্রানজেকশন ম্যানেজমেন্ট ডাটাবেস অপারেশনের স্থায়িত্ব (Consistency) এবং সঠিকতা (Integrity) নিশ্চিত করে। Spring Framework ট্রানজেকশন ম্যানেজমেন্টের জন্য শক্তিশালী ও নমনীয় সমাধান প্রদান করে।
দুটি ট্রানজেকশন ম্যানেজমেন্ট পদ্ধতি:
- Declarative Transaction Management:
@Transactionalঅ্যানোটেশন ব্যবহার করে ট্রানজেকশন নির্ধারণ করা হয়। - Programmatic Transaction Management:
TransactionTemplateবাPlatformTransactionManagerএর মাধ্যমে কোডের মাধ্যমে ট্রানজেকশন নিয়ন্ত্রণ করা হয়।
Declarative Transaction Management
@Transactional অ্যানোটেশন ব্যবহার করে ট্রানজেকশন নির্ধারণ করা হয়। এটি Spring Framework-এ ট্রানজেকশন ম্যানেজমেন্টের সবচেয়ে জনপ্রিয় পদ্ধতি।
উদাহরণ: @Transactional ব্যবহার
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Service
public class BankService {
@Autowired
private AccountRepository accountRepository;
@Transactional
public void transferMoney(Long fromAccountId, Long toAccountId, Double amount) {
Account fromAccount = accountRepository.findById(fromAccountId).orElseThrow();
Account toAccount = accountRepository.findById(toAccountId).orElseThrow();
fromAccount.setBalance(fromAccount.getBalance() - amount);
toAccount.setBalance(toAccount.getBalance() + amount);
accountRepository.save(fromAccount);
accountRepository.save(toAccount);
}
}
কী ঘটে @Transactional এর মাধ্যমে?
- সব ডাটাবেস অপারেশন একটি ট্রানজেকশন ব্লকের মধ্যে সম্পন্ন হয়।
- যদি কোনো অপারেশনে সমস্যা হয় (যেমন Exception), তবে সমস্ত পরিবর্তন বাতিল (Rollback) হয়।
Programmatic Transaction Management
Programmatic Transaction Management ব্যবহার করে আপনি কোডের মাধ্যমে ট্রানজেকশন শুরু, কমিট এবং রোলব্যাক নিয়ন্ত্রণ করতে পারেন।
উদাহরণ: TransactionTemplate ব্যবহার
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.support.TransactionTemplate;
@Service
public class BankService {
@Autowired
private TransactionTemplate transactionTemplate;
@Autowired
private AccountRepository accountRepository;
public void transferMoney(Long fromAccountId, Long toAccountId, Double amount) {
transactionTemplate.executeWithoutResult(transactionStatus -> {
Account fromAccount = accountRepository.findById(fromAccountId).orElseThrow();
Account toAccount = accountRepository.findById(toAccountId).orElseThrow();
fromAccount.setBalance(fromAccount.getBalance() - amount);
toAccount.setBalance(toAccount.getBalance() + amount);
accountRepository.save(fromAccount);
accountRepository.save(toAccount);
});
}
}
@Transactional এর গুরুত্বপূর্ণ বৈশিষ্ট্য
Propagation (প্রসারণ)
Spring Boot ট্রানজেকশনের প্রসারণ নিয়ন্ত্রণ করতে বিভিন্ন Propagation মোড সরবরাহ করে:
- REQUIRED: ডিফল্ট মোড; বিদ্যমান ট্রানজেকশনে যোগ দেয়, না থাকলে নতুন শুরু করে।
- REQUIRES_NEW: সবসময় নতুন ট্রানজেকশন তৈরি করে।
- NESTED: একটি বিদ্যমান ট্রানজেকশনের মধ্যে সাব-ট্রানজেকশন তৈরি করে।
Isolation Level (আইসোলেশন স্তর)
Spring Boot আইসোলেশন স্তর নির্ধারণ করতে দেয়:
- READ_COMMITTED: কেবলমাত্র নিশ্চিত ডেটা পড়া যায়।
- REPEATABLE_READ: একই ট্রানজেকশনের মধ্যে বারবার পড়লে একই ডেটা রিটার্ন হয়।
- SERIALIZABLE: সম্পূর্ণ সিকোয়েন্সিয়াল ট্রানজেকশন প্রক্রিয়া।
Rollback Policy
কোনো নির্দিষ্ট Exception ঘটলে ট্রানজেকশন বাতিল করতে rollbackFor বা noRollbackFor ব্যবহার করা হয়।
@Transactional(rollbackFor = CustomException.class)
public void someTransactionalMethod() {
// Method Logic
}
Transaction Management ব্যবহার কেন গুরুত্বপূর্ণ?
- ডেটার স্থায়িত্ব নিশ্চিত করে: অপারেশন ব্যর্থ হলেও ডেটাবেসের অবস্থা আগের অবস্থায় ফিরে আসে।
- ডেটাবেস কনসিস্টেন্সি বজায় রাখে: একাধিক অপারেশন একটি ইউনিট হিসাবে কাজ করে।
- ডেভেলপমেন্ট সহজ করে:
@Transactionalব্যবহার করে স্বয়ংক্রিয়ভাবে কমিট বা রোলব্যাক করা হয়।
সারাংশ
Spring Boot এ Transaction Management ডেটাবেস অপারেশনগুলোর সঠিকতা ও স্থায়িত্ব নিশ্চিত করার জন্য গুরুত্বপূর্ণ ভূমিকা পালন করে। @Transactional ব্যবহার করে Declarative পদ্ধতিতে সহজে ট্রানজেকশন পরিচালনা করা যায়, আর Programmatic পদ্ধতিতে ট্রানজেকশন নিয়ন্ত্রণের আরও বেশি ক্ষমতা পাওয়া যায়।
Read more